# -*- coding: utf-8 -*-
# Python中默认的编码格式是 ASCII 格式，在没修改编码格式时无法正确打印汉字，所以在读取中文时会报错。

# 在“发出IO请求”到收到“IO完成”的这段时间里，同步IO模型下，主线程只能挂起，
# 但异步IO模型下，主线程并没有休息，而是在消息循环中继续处理其他消息。
# 这样，在异步IO模型下，一个线程就可以同时处理多个IO请求，并且没有切换线程的操作。
# 对于大多数IO密集型的应用程序，使用异步IO将大大提升系统的多任务处理能力。

# 我们先来看下对协程的概括：协程被称为微线程或者纤程，是一种用户态的轻量级线程。
# 其本质就是一个单线程，协程的作用就是在一个线程中人为控制代码块的执行顺序。

# 在greenlet中，target.switch（value）可以切换到指定的协程（target），
# 然后yield value。greenlet用switch来表示协程的切换，从一个协程切换到另一个协程需要显式指定

# https://segmentfault.com/a/1190000000613814
# https://www.liaoxuefeng.com/wiki/1016959663602400/1017968846697824
# https://www.cnblogs.com/zingp/p/5911537.html
# https://blog.csdn.net/bandaoyu/article/details/90583629
import time

from greenlet import greenlet

def tes1():
    time.sleep(1.5)
    print (12)
    gr2.switch()        # 《如果调用函数，会出现套娃》
    print (34)          # 执行完返回主线程
    # gr2.switch()

def tes2():
    print (56)
    gr1.switch()
    print (78)

print(1)
gr1 = greenlet(tes1)
print(2)
gr2 = greenlet(tes2)
print(3)
gr1.switch()            #  gr1.switch() 恰恰实现了从 main 到 gr1 的跳跃      执行的时候主线程也可卡了
time.sleep(2)
print(4)





